package files

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"os"
	"path"
	"sg-backend/global"
	"sg-backend/model/user"
	"sg-backend/utils"
)

func UploadFile(ctx *fiber.Ctx) error {

	// 获取保存路径
	uploadToPath := ctx.Query("path")

	// 判断主文件夹存不存在
	_, e := os.Stat("./media")
	if e != nil {
		// 主文件夹不存在，需要创建
		err := os.Mkdir("./media", 0755)
		if err != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "主文件夹media创建失败！",
			})
		}
	}

	// 判断路径文件夹存不存在
	_, e = os.Stat(fmt.Sprintf("./media/%s", uploadToPath))
	if e != nil {

		// 文件夹不存在，需要创建
		err := os.Mkdir(fmt.Sprintf("./media/%s", uploadToPath), 0755)
		if err != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "上传文件夹创建失败！",
			})
		}
	}

	// 获取附件
	file, err := ctx.FormFile("file")
	if err != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "未能成功获取file，请刷新页面重新上传！",
		})
	}

	//  1，获取时间戳信息，
	var saveTimestamp = utils.GetCurrentTimeStr()

	// 2，获取文件夹的后缀名
	suffix := path.Ext(file.Filename)

	// 3，计算自然大小（KB,MB,GB,TB)
	var fileSize = utils.CalcFileSize(file.Size)

	// 4,保存附件
	saveName := saveTimestamp + suffix
	savePath := fmt.Sprintf("./media/%s/%s", uploadToPath, saveName)
	filePath := fmt.Sprintf("/media/%s/%s", uploadToPath, saveName)
	err = ctx.SaveFile(file, savePath)
	if err != nil {
		fmt.Println(err.Error())
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "文件保存失败！" + err.Error(),
		})
	}

	// 5，读取计算MD5
	fileMd5 := utils.GetFileMd5(savePath)

	// 6，保存并返回文件ID和PATH
	_fileId := uint(0)
	_filePath := string("")
	var fileObj user.Files
	r := global.DB.Where("md5 = ?", fileMd5).First(&fileObj)
	if r.RowsAffected == 0 {

		// 系统中不存在
		// 保存到数据库
		newFile := user.Files{
			Name:     file.Filename,
			SaveName: saveName,
			UploadBy: global.AuthUser.Username,
			Md5:      fileMd5,
			Path:     filePath,
			Size:     fileSize,
			Suffix:   suffix,
			M3u8:     false,
			IsTemp:   false,
		}
		sr := global.DB.Create(&newFile)
		if sr.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "文件保存成功，但写入数据库失败！错误：" + r.Error.Error(),
			})
		}

		// 获取文件ID和路径
		_fileId = newFile.Id
		_filePath = filePath
	} else {

		// 系统中已存在
		// 获取系统中的path和文件ID返回
		_fileId = fileObj.Id
		_filePath = fileObj.Path

		// 删除此次保存的文件
		os.Remove(savePath)
	}

	// 通知前端
	return ctx.JSON(fiber.Map{
		"status":  "done",
		"message": "上传成功！",
		"fid":     _fileId,
		"path":    _filePath,
	})
}
